package com.smile.frame.websocket.netty.service.repository;

import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 通道channel map
 *
 * @author LGC
 */
@Slf4j
public class ChannelRepository {

    /**
     * 通道map，存储channel，用于群发消息，以及统计客户端的在线数量，解决问题三，如果是集群环境使用redis的hash数据类型存储即可
     * 问题三单机如何统计同时在线的客户数量？websocket集群如何统计在线的客户数量呢？
     */
    public static final ConcurrentHashMap<String, Channel> CHANNEL_MAP = new ConcurrentHashMap<>();

    /**
     * 通过通道ID获取通道
     */
    public static Channel getChannel(String channelId) {
        return CHANNEL_MAP.get(channelId);
    }


    /**
     * 是否存在channel
     */
    public static Boolean containsKey(String channelId) {
        return CHANNEL_MAP.containsKey(channelId);
    }

    /**
     * 保存channel
     */
    public static void putChannel(String channelId, Channel channel) {
        CHANNEL_MAP.put(channelId, channel);
    }

    /**
     * 保存channel
     */
    public static void putChannel(Channel channel) {
        CHANNEL_MAP.put(channel.id().asLongText(), channel);
        log.info("channelId:{},channel:{}", channel.id().asLongText(), channel);
    }


    /**
     * 移除管道
     */
    public static void removeChannel(String channelId) {
        CHANNEL_MAP.remove(channelId);
    }

    /**
     * 移除管道
     */
    public static void removeChannel(Channel channel) {
        CHANNEL_MAP.remove(channel.id().asLongText());
    }


}
